<?php
@session_start();




class nfwkDB extends nfwk {

    protected static $_DBCONN       = null;
    protected static $_DBCONNSTRING = null;
    private $_sysMsg                = null;
    private $_Return                = null;

    //------------------------------------------------------------------------//

    public function __construct() {
        
        parent::__construct();
        
        $this->_DBConnString = NFWK_DBTYPE."://".NFWK_DBUSER.":".NFWK_DBPASS."@".NFWK_DBHOST."/".NFWK_DBNAME;
        $this->_DBConn       = NewADOConnection($this->_DBConnString);
        $this->_bQuery = array( "select" => null,
                                      "from"   => null,
                                      "where"  => null,
                                      "order"  => null);
        $this->_sysMsg       = new nfwkLocales();
        $ADODB_FETCH_MODE    = ADODB_FETCH_BOTH;

    }
    
    //------------------------------------------------------------------------//
    
    public function __destruct() {
        
        parent::__destruct();
        unset($this->_bQuery);
        $this->_Return       = null;
        $this->_DBCONN       = null;
        $this->_DBCONNSTRING = null;
        
    }

    //------------------------------------------------------------------------//
    
    public function execQuery($QueryString=null, $ResultSet="full") {

        try {
            if (!is_null($QueryString) || !empty($QueryString)) {
                /* In base a quanto passato in $ResultSet viene restituita o una
                 * riga singola del database, oppure un array di risultati.
                 * Di default vengono associati tutti i rsiultati all'interno di
                 * un array (full) e non una riga singola (row).
                 */
                switch(strtolower($ResultSet)) {
                    case "full":
                        $this->_Return = $this->_DBConn->Execute($QueryString);
                        break;
                    case "row":
                        $this->_Return = $this->_DBConn->GetRow($QueryString);
                        break;
                    default:
                        $this->_Return = $this->_DBConn->Execute($QueryString);
                        break;
                }
            } else {
                /* Se la query non è stata correttamente impostata, viene 
                 * generata l'eccezione con il messaggio relativ0.
                 */
                throw new nfwkException($this->_sysMsg->sysError("30100"));
            }
        } catch (Exception $e) {
            /* Se la procedura di try&catch non viene completata in maniera 
             * corretta, viene restituito a schermo messaggio ed errore con
             * codice relativo.
             */
            echo "Riscontrata Eccezione:<br /><b><i>", $e->getMessage()."</i></b><hr />";
        
        }

        return $this->_Return;
        
    } 

    
    //------------------------------------------------------------------------//
    

    public function getDataPairFromTable($table=null, $fieldValue=null, $fieldLabel=null, $where=null, $order=null) {
    /*
     * La funzione getDataPairFromTable permette di recuperare con una sola 
     * chiamata dati a coppie da una specifica tabella del database. Questa 
     * funzione ha lo scopo di semplificare la generazione di campi nei form 
     * quali dropdown, menu, check e radio.
     * 
     * Parametri della funzione (* OBBLIGATORIO)
     * $table*..........: Nome tabella da cui recupeare i dati.
     * $fieldValue*.....: Campo, solitamente il valore ID da assegnare.
     * $fieldLabel*.....: Campo che sarà la label o il valore da visualizzare.
     * $where...........: Condizione WHERE della QUERY
     * $order...........: Ordinamento dei dati recuperati
     * 
     * Valori Predefiniti parametri.
     * $where...........: null (equivale a non avere condizioni WHERE)
     * $order...........: null (di default utilizza "ORDER BY $fieldLabel ASC)
     * 
     * Chiamate alternative parametri:
     * $where - Forma SQL standard e contratta.
     * es.: {CAMPO} = '{TESTO}' (con apici)
     *      {CAMPO} = {NUMERICO} (senza apici)
     *      {CAMPO} = (SELECT {CAMPO1} FROM ...) (select in select)
     *      {CAMPO} = {CAMPO}:{TABELLA}:{CAMPOWHERE}:'{VALOREWHERE}' (testo, con apici)
     *      {CAMPO} = {CAMPO}:{TABELLA}:{CAMPOWHERE}:{VALOREWHERE} (numerico, senza apici)
     * 
     * $order - Forma SQL standard e contratta.
     * es.: ORDER BY {CAMPO} ASC
     *      ORDER BY {CAMPO} DESC
     *      {CAMPO}:ASC (equivalente a scrivere solo {CAMPO})
     *      {CAMPO} (equivalente a scrivere solo {CAMPO}:ASC)
     */
        
        $SystemMessages = new nfwkLocales();
        
        try {
            // Genero le eccezioni se mancano i valori da passare nella funzione
            if (empty($table))      { throw new nfwkException($SystemMessages->ReturnError("30000")); }
            if (empty($fieldLabel)) { throw new nfwkException($SystemMessages->ReturnError("30000")); }
            if (empty($fieldValue)) { throw new nfwkException($SystemMessages->ReturnError("30000")); }

            // Compongo la query che dovrà essere processata da ADODB
            $this->_Qstring = "SELECT ".$fieldValue.", ".$fieldLabel." FROM ".$table;
            
            if (!empty($where)) {
                if (preg_match(".\:.", $where)) {
                    $WhereAF = explode("=", $where);
                    $WhereAC = explode(":", trim($WhereAF[1]));

                    $this->_Qstring .= " WHERE ".trim($WhereAF[0]).
                            " = (SELECT ".trim($WhereAC[0])." FROM ".trim($WhereAC[1]).
                            " WHERE ".trim($WhereAC[2])." = ".trim($WhereAC[3]).")"; 
                } else {
                    $this->_Qstring .= " WHERE ".$where; 
                }
            }

            if (!empty($order)) {
                if (preg_match(".\:.", $order)) {
                    $OrderArray = explode(":", $order);
                    $this->_Qstring .= " ORDER BY ".trim($OrderArray[0])." ".trim(strtoupper($OrderArray[1]));
                } else {
                    $this->_Qstring .= " ORDER BY ".trim($order)." ASC";
                }
            } else {
                $this->_Qstring .= " ORDER BY ".$fieldLabel." ASC";
            }

        } catch(nfwkException $e) { echo $e->getMessage(); }
        
        // Se non si sono presentati problemi prima, restituisco i dati
        $nfwkDBO = new nfwkDB;
        return $nfwkDBO->exeQuery($this->_Qstring);
    }

}


?>
